package com.wyl.reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author 吴宇亮 on 2023/6/26 9:27
 */
public class Main {

    public static void main(String[] args) throws InterruptedException {
        // 强引用
        Object strongRef = new Object();
        // 弱引用
        WeakReference<String> weakRef = new WeakReference<>("我是弱引用");
        // 软引用对象
        SoftReference<String> sorfRef = new SoftReference<>("我是软引用");
        // 创建一个字符串对象，并创建一个虚引用和关联的 ReferenceQueue 对象
        Object phantomRefObject = new Object();
        ReferenceQueue<Object> phantomRefQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomRef = new PhantomReference<>(phantomRefObject, phantomRefQueue);
        // 将对象设为 null，并等待垃圾回收器回收该对象
        phantomRefObject = null;
        // 建议执行垃圾回收
        System.gc();

        Thread.sleep(1000);

        String weakRefObject = weakRef.get();
        if (null != weakRefObject) {
            System.out.println("弱引用没有被回收： " + weakRefObject);
        } else {
            System.out.println("弱引用已被回收");
        }
        String sortRefObject = sorfRef.get();
        if (null != sortRefObject) {
            System.out.println("软引用没有被回收： " + weakRefObject);
        } else {
            System.out.println("软引用已被回收");
        }
        // 判断虚引用是否被加入到 ReferenceQueue 中
        if (phantomRefQueue.poll() == phantomRef) {
            System.out.println("虚引用：对象已经添加到队列中，说明对象已经被回收");
        } else {
            System.out.println("虚引用：对象还未添加到队列中，说明对象还没被回收");
        }
    }
}
